"""
区域配置管理模块。
EN: Region configuration management module.

该模块提供了用于获取、管理和校验系统区域相关配置的函数，
包括从请求头中获取区域键、判断是否为异地区域、加载区域配置等。
EN: This module provides functions for retrieving, managing, and validating system region-related configurations,
including getting region keys from request headers, determining if a region is remote, and loading region configurations.
"""

# 导入日志模块，用于记录程序运行时的信息
# EN: Import the logging module, used for recording information during program execution
import logging
# 导入 SimpleNamespace，用于创建简单的对象，方便访问字典中的数据
# EN: Import SimpleNamespace, used to create simple objects for easy access to dictionary data
from types import SimpleNamespace

# 从 flask 模块导入 request 对象，用于获取 HTTP 请求信息
# EN: Import the request object from the flask module, used to get HTTP request information
from flask import request
# 从 myapp.configs.region 模块导入 REGION_CONFIG，该配置定义了区域相关规则
# EN: Import REGION_CONFIG from myapp.configs.region module, which defines region-related rules
from myapp.configs.region import REGION_CONFIG


def _regions_list_to_dict(regions_list: list) -> dict:
    """
    将区域信息列表转换为字典，方便按区域键查询。
    EN: Converts a list of region information into a dictionary for easy lookup by region key.

    Args:
        regions_list (list): 包含区域信息字典的列表。
        EN: regions_list (list): A list containing dictionaries of region information.

    Returns:
        dict: 以区域键为 key，区域信息字典为 value 的字典。
        EN: dict: A dictionary where region keys are keys and region information dictionaries are values.
    """
    # 使用字典推导式将列表转换为字典
    # EN: Use a dictionary comprehension to convert the list to a dictionary
    return {item['key']: item for item in regions_list}


def get_region_key(key: str = 'Region') -> str:
    """
    从 HTTP 请求头中获取区域键。
    EN: Retrieves the region key from the HTTP request headers.

    如果请求头中未找到指定的区域键，则默认使用 'default'。
    EN: If the specified region key is not found in the request headers, 'default' is used by default.

    Args:
        key (str, optional): 请求头中用于获取区域键的字段名。默认为 'Region'。
        EN: key (str, optional): The field name in the request header used to retrieve the region key. Defaults to 'Region'.

    Returns:
        str: 获取到的区域键。
        EN: str: The retrieved region key.
    """
    # 从请求头中获取区域键
    # EN: Get the region key from the request headers
    region_key = request.headers.get(key, None)
    # 如果区域键为空
    # EN: If the region key is None
    if region_key is None:
        # 记录警告日志
        # EN: Log a warning message
        logging.warning("[get_region_key] get region_key from header is None, use 'default'")
        # 设置为默认区域键
        # EN: Set to the default region key
        region_key = 'default'
    # 返回区域键
    # EN: Return the region key
    return region_key


def is_remote_region(region_key: str) -> bool:
    """
    判断指定区域是否是异地区域（非默认区域）。
    EN: Determines if the specified region is a remote region (non-default region).

    Args:
        region_key (str): 需要判断的区域键。
        EN: region_key (str): The region key to check.

    Returns:
        bool: 如果是异地区域返回 True，否则返回 False。
        EN: bool: Returns True if it is a remote region, False otherwise.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = get_region_config()
    # 获取默认区域列表
    # EN: Get the list of default regions
    default_regions = region_config.get('default_regions', [])
    # 记录默认区域信息
    # EN: Log default region information
    logging.info(f'[is_remote_region] default_regions: {default_regions}')
    # 判断区域键是否在默认区域列表中
    # EN: Check if the region key is in the list of default regions
    if region_key in region_config.get('default_regions', []):
        # 如果是默认区域，返回 False
        # EN: If it is a default region, return False
        return False
    else:
        # 如果不是默认区域，返回 True
        # EN: If it is not a default region, return True
        return True


def get_region_config() -> dict:
    """
    获取区域相关配置，对应 Nacos 中的 `region_config` 表。
    EN: Retrieves region-related configurations, corresponding to the `region_config` table in Nacos.

    Returns:
        dict: 区域配置字典。
        EN: dict: A dictionary of region configurations.
    """
    # 从 REGION_CONFIG 中获取配置并转换为字典
    # EN: Get configurations from REGION_CONFIG and convert to a dictionary
    region_config = REGION_CONFIG.to_dict()
    # 返回区域配置
    # EN: Return region configurations
    return region_config


def get_regions_info() -> list:
    """
    获取所有区域的详细信息。
    EN: Retrieves detailed information for all regions.

    Returns:
        list: 包含所有区域信息字典的列表。
        EN: list: A list containing dictionaries of all region information.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 从配置中获取 'regions' 列表，如果不存在则返回空列表
    # EN: Get the 'regions' list from the configurations, return an empty list if not found
    return region_config.get('regions', [])


def get_region_keys() -> list[str]:
    """
    获取所有区域的键列表。
    EN: Retrieves a list of keys for all regions.

    Returns:
        list[str]: 包含所有区域键的列表。
        EN: list[str]: A list containing all region keys.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 获取区域信息列表
    # EN: Get the list of region information
    regions_list = region_config.get('regions', {})
    # 将区域信息列表转换为字典
    # EN: Convert the list of region information to a dictionary
    regions_dict = _regions_list_to_dict(regions_list=regions_list)
    # 返回所有区域键的列表
    # EN: Return a list of all region keys
    return list(regions_dict.keys())


def get_non_default_regions() -> list:
    """
    获取所有非默认区域的详细信息。
    EN: Retrieves detailed information for all non-default regions.

    Returns:
        list: 包含所有非默认区域信息字典的列表。
        EN: list: A list containing dictionaries of all non-default region information.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 获取所有区域的详细信息
    # EN: Get detailed information for all regions
    regions_info = region_config.get('regions', {})
    # 获取默认区域列表
    # EN: Get the list of default regions
    default_regions = region_config.get('default_regions', [])
    # 将区域信息列表转换为字典
    # EN: Convert the list of region information to a dictionary
    regions_dict = _regions_list_to_dict(regions_list=regions_info)
    # 过滤出非默认区域并返回
    # EN: Filter out non-default regions and return them
    return [item for item in regions_dict.values() if item['key'] not in default_regions]


def get_region_by_key(region_key: str) -> dict or None:
    """
    通过区域键获取指定区域的详细信息。
    EN: Retrieves detailed information for a specified region by its region key.

    Args:
        region_key (str): 需要查询的区域键。
        EN: region_key (str): The region key to query.

    Returns:
        dict or None: 如果找到对应的区域，返回其信息字典；否则返回 None。
        EN: dict or None: Returns the region information dictionary if found; otherwise, returns None.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 获取所有区域的详细信息
    # EN: Get detailed information for all regions
    regions_info = region_config.get('regions', {})
    # 将区域信息列表转换为字典
    # EN: Convert the list of region information to a dictionary
    regions_dict = _regions_list_to_dict(regions_list=regions_info)
    # 根据区域键从字典中获取区域信息，如果不存在则返回 None
    # EN: Get region information from the dictionary by region key, return None if not found
    return regions_dict.get(region_key, None)


def get_cluster_name_by_key(region_key: str) -> str or None:
    """
    通过区域键获取指定区域的 Kubernetes 集群名称。
    EN: Retrieves the Kubernetes cluster name for a specified region by its region key.

    Args:
        region_key (str): 需要查询的区域键。
        EN: region_key (str): The region key to query.

    Returns:
        str or None: 如果找到对应的集群名称，返回其字符串；否则返回 None。
        EN: str or None: Returns the cluster name string if found; otherwise, returns None.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 获取所有区域的详细信息
    # EN: Get detailed information for all regions
    regions_info = region_config.get('regions', {})
    # 将区域信息列表转换为字典
    # EN: Convert the list of region information to a dictionary
    regions_dict = _regions_list_to_dict(regions_list=regions_info)
    # 从区域信息中获取 k8s 配置，并进一步获取 'cluster_name'
    # EN: Get k8s configurations from region information, and further get 'cluster_name'
    cluster_name = regions_dict.get(region_key, {}).get('k8s', {}).get('cluster_name', None)
    # 记录集群名称信息
    # EN: Log cluster name information
    logging.info(f'[get_cluster_name_by_key] cluster_name {cluster_name}')

    # 返回集群名称
    # EN: Return the cluster name
    return cluster_name


def get_region_obj_by_key(region_key: str) -> SimpleNamespace or None:
    """
    通过区域键获取指定区域的信息，并以 SimpleNamespace 对象形式返回。
    EN: Retrieves information for a specified region by its region key and returns it as a SimpleNamespace object.

    Args:
        region_key (str): 需要查询的区域键。
        EN: region_key (str): The region key to query.

    Returns:
        SimpleNamespace or None: 如果找到对应的区域，返回其 SimpleNamespace 对象；否则返回 None。
        EN: SimpleNamespace or None: Returns the SimpleNamespace object for the region if found; otherwise, returns None.
    """
    # 获取区域配置
    # EN: Get region configurations
    region_config = REGION_CONFIG.to_dict()
    # 获取所有区域的详细信息
    # EN: Get detailed information for all regions
    regions_info = region_config.get('regions', {})
    # 将区域信息列表转换为字典
    # EN: Convert the list of region information to a dictionary
    regions_dict = _regions_list_to_dict(regions_list=regions_info)
    # 如果区域字典为空或者指定区域键不存在，则返回 None
    # EN: If the region dictionary is empty or the specified region key does not exist, return None
    if regions_dict is None or regions_dict.get(region_key, None) is None:
        return None
    # 将区域信息字典转换为 SimpleNamespace 对象并返回
    # EN: Convert the region information dictionary to a SimpleNamespace object and return it
    return SimpleNamespace(**regions_dict.get(region_key, None))
